( w =>{

    w.name = '开发喵' ;
    console.log( 'utils : ' , w.name );

    class Wrapper {
        constructor( element ) {
            this.element = element ;
        }
        // 在函数的形参列表中可以直接指定参数的默认值
        bind( type , listener , capture = false ) {
            // 若 this.element 存在并且属于 元素节点 (ELEMENT_NODE)
            if( this.element && this.element.nodeType === Node.ELEMENT_NODE ) {
                // 通过调用 EventTarget.prototype.addEventListener 绑定事件监听器
                this.element.addEventListener( type , listener , capture );
            }
        }
        click( listener ){
            this.bind( 'click' , listener );
        }
        dblclick( listener ){
            this.bind( 'dblclick' , listener );
        }
        mouseover( listener ){
            this.bind( 'mouseover' , listener );
        }
        content( message = null ){
            // 获得在 Wrapper 实例中包裹的 DOM 元素
            let self = this.element ;
            // 获得当前 Wrapper 中所包裹的 DOM元素的 节点名称
            let nodeName = self.nodeName.toLowerCase() ;

            // 若 message 不为 null 则执行赋值操作
            if( message ) {
                // 暂时只考虑 input 和 textarea ，不考虑处理 select
                if( nodeName === 'input' || nodeName === 'textarea' ){
                    self.value = message ;
                    return ;
                }
                // 其它元素采用 innerHTML 将内容设置到元素上
                self.innerHTML = message ;
                return ;
            }

            // 若 message 为 null 则获取元素中的内容
            // 若 节点名称为 input 或 textarea 则直接返回 value 属性值 ( 暂不考虑 select 元素 )
            if( nodeName === 'input' || nodeName === 'textarea' ){
                return self.value ;
            }
            // 除 input 和 textarea 外，其它元素一律返回 innerHTML
            return self.innerHTML ;
        }
    }

    let X = function( selector ){
        // 根据参数传入的CSS选择器选择页面上匹配于该选择器的所有元素
        let nodeList = document.querySelectorAll( selector );
        // 没有任何元素匹配于指定的选择器
        if( nodeList.length === 0 ) {
            return null ; // 则返回 null
        }
        // 仅存在一个匹配于指定选择器的元素
        if( nodeList.length === 1 ) {
            // 获得 nodeList 中惟一的元素(元素DOM元素)
            let element = nodeList[0] ;
            // 将 DOM 元素包裹到 Wrapper 实例中
            let wrapper = new Wrapper( element );
            // 返回一个 Wrapper 实例
            return wrapper ;
        }
        // 若存在多个元素则返回数组实例 (xxx未处理成Wrapper实例xxx)
        return Array.from( nodeList );
    }

    // 将局部变量 X 赋值到 window 对象的属性上
    w.$ = X ;

})( window );